/******************************************************************************************
文件名：connect_manager.h
作者：狼狼    版本：V1.0    创建日期：2021.9.3
文件描述：
    头文件。
历史修改记录：
1. 2021-9-3:V1.0 狼狼
创建。
2. 2022-5-11:V1.0 狼狼
代码公开。
******************************************************************************************/
#ifndef CONNECT_MANAGER__
#define CONNECT_MANAGER__
//+------------------------------------------------------------------------------------------+
//|                                           头文件
//+------------------------------------------------------------------------------------------+
/*|*/#include <stdint.h>
/*|*/#include <stdbool.h>
/*|*/#include <pthread.h>
//+------------------------------------------------------------------------------------------+
//|                                         参数宏定义
//+------------------------------------------------------------------------------------------+
/*|*/#define CONN_SUCCESS               0x00000000
//|    ----------------------------------------
//|    错误码：非法的参数
//|    ----------------------------------------
/*|*/#define CONN_ERROR_ILLEGAL_PARAM   0x90041001
//|    ----------------------------------------
//|    错误码：套接字错误
//|    ----------------------------------------
/*|*/#define CONN_ERROR_SOCKET          0x90041002
//|    ----------------------------------------
//|    错误码：互斥锁操作失败
//|    ----------------------------------------
//|  #define CONN_ERROR_METUX           0x90041003
//|    ----------------------------------------
//|    错误码：申请内存错误
//|    ----------------------------------------
/*|*/#define CONN_ERROR_MALLOC          0x90041004
//|    ----------------------------------------
//|    错误码：创建线程错误
//|    ----------------------------------------
/*|*/#define CONN_ERROR_THREAD          0x90041005
//|    ----------------------------------------
//|    错误码：当前套接字状态不支持此操作
//|    ----------------------------------------
/*|*/#define CONN_ERROR_UNEXPECT_STATE  0x90042001
//|    ----------------------------------------
//|    错误码：待存入的数据长度超出合法范围
//|    ----------------------------------------
/*|*/#define CONN_ERROR_UNEXPECT_DATA_LENGTH 0x90042002
//|    ----------------------------------------
//|    错误码：当前连接管理会话列表已满
//|    ----------------------------------------
/*|*/#define CONN_ERROR_SESSION_LIST_FULL  0x90043001
//|    ----------------------------------------
//|    错误码：当前连接管理会话列表是空的
//|    ----------------------------------------
/*|*/#define CONN_ERROR_SESSION_LIST_EMPTY  0x90043002
//|    ----------------------------------------
//|    错误码：会话已经被注册
//|    ----------------------------------------
/*|*/#define CONN_ERROR_SESSION_REGISTERED 0x90043003
//|    ----------------------------------------
//|    错误码：会话不存在
//|    ----------------------------------------
/*|*/#define CONN_ERROR_SESSION_NON_EXISTENT 0x90043005
//|
//|    ----------------------------------------
//|    退出原因状态码：
//|    0.未退出(CONN_SUCCESS)        0x00000000
//|    2.接收异常                    0x9004E002
//|    3.连接断开或会话被主动关闭    0x9004E003
//|    4.send系统调用失败            0x9004E004
//|    5.recv系统调用失败            0x9004E005
//|    6.select系统调用失败          0x9004E006
//|    ----------------------------------------
/*|*/#define CONN_EXIT_STAT_RX_ERROR            0x9004E002
/*|*/#define CONN_EXIT_STAT_DISCONNECT_OR_CLOSE 0x9004E003
/*|*/#define CONN_EXIT_STAT_SEND_ERROR          0x9004E004
/*|*/#define CONN_EXIT_STAT_RECV_ERROR          0x9004E005
/*|*/#define CONN_EXIT_STAT_SELECT_ERROR        0x9004E006
//+------------------------------------------------------------------------------------------+
//|                                          数据类型
//+------------------------------------------------------------------------------------------+
//|    ----------------------------------------
//|    连接管理支持的最大连接数
//|    NOTE:仅内部使用
//|    ATTENTION:当前对内部连接记录数组使用轮询
//|              方式进行遍历查找，因此该数量不
//|              宜过大，否则会存在效率问题。
//|    ATTENTION:为防止FD_SET越界问题，默认配置
//|              的情况下最大连接数量不能超过
//|              1024。
//|    ----------------------------------------
/*|*/#define MAX_CONNECT_NUM 1
//|
//|    ----------------------------------------
//|    连接管理对象状态
//|    NOTE:仅内部使用
//|    ----------------------------------------
/*|*/typedef enum tcp_conn_state
/*|*/{
/*|*/    TCP_CONN_STAT_INIT = 0,
/*|*/    TCP_CONN_STAT_OK,
/*|*/    TCP_CONN_STAT_STANDBY, /* 此状态表示该会话虽然在记录表中，但并未参与接收轮询 */
/*|*/    TCP_CONN_STAT_END,
/*|*/}ENUM_TCP_CONN_STATE;
//|
//|    ----------------------------------------
//|    用于存储一个TCP客户端连接必要信息的结构
//|    ----------------------------------------
/*|*/typedef struct tcp_conn
/*|*/{
//|      ----------------------------------------
//|      TCP通信套接字
//|      ----------------------------------------
/*|*/    int conn_sock;
//|      ----------------------------------------
//|      该TCP通信会话持有的ID
//|      NOTE:会话ID在创建处理线程时分配，若处理
//|           线程创建失败等，则不会为该连接分配
//|           ID，因为ID是设计用于会话轮询和信息
//|           打印。
//|      ----------------------------------------
/*|*/    uint32_t session_id;
//|      ----------------------------------------
//|      当前会话的状态
//|      ----------------------------------------
/*|*/    ENUM_TCP_CONN_STATE state;
//|      ----------------------------------------
//|      TX发送互斥锁
//|      ----------------------------------------
/*|*/    pthread_mutex_t tx_mutex;
//|      ----------------------------------------
//|      描述该连接的IP四元组信息
//|      ----------------------------------------
/*|*/    char local_ip_address[16];
/*|*/    char remote_ip_address[16];
/*|*/    int local_ip_port;
/*|*/    int remote_ip_port;
/*|*/}ST_TCP_CONN;
//|
//|    ----------------------------------------
//|    连接管理对象状态
//|    NOTE:仅内部使用
//|    ----------------------------------------
/*|*/typedef enum connect_manager_state
/*|*/{
/*|*/    CONN_MANAGER_STAT_INIT = 0,
/*|*/    CONN_MANAGER_STAT_OK,
/*|*/    CONN_MANAGER_STAT_EXIT,
/*|*/}ENUM_CONN_MANAGER_STATE;
//|
//|    ----------------------------------------
//|    TCP客户端连接管理对象结构
//|    ----------------------------------------
/*|*/typedef struct connect_manager
/*|*/{
//|      ----------------------------------------
//|      连接管理对象状态信息
//|      ----------------------------------------
/*|*/    ENUM_CONN_MANAGER_STATE state;
//|      ----------------------------------------
//|      连接管理对象异常退出状态指示
//|      ----------------------------------------
/*|*/    int exit_state;
//|      ----------------------------------------
//|      线程运行许可
//|      NOTE:此标志位为管理线程和接收处理线程循
//|           环判断标志。
//|      ----------------------------------------
/*|*/    bool flag_run;
//|      ----------------------------------------
//|      接收线程句柄
//|      ----------------------------------------
/*|*/    pthread_t recv_tid;
//|      ----------------------------------------
//|      连接列表
//|      ----------------------------------------
/*|*/    ST_TCP_CONN *connection_list[MAX_CONNECT_NUM];
//|      ----------------------------------------
//|      连接列表中存储的连接数量
//|      ----------------------------------------
/*|*/    uint32_t connection_num;
//|      ----------------------------------------
//|      回调函数集
//|      NOTE:以下函数指针在初始化连接管理对象时
//|           被赋值。
//|      ATTENTION:使用连接管理结构对象成员函数指
//|                针前必须先对其进行初始化！
//|      ----------------------------------------
/*|*/    int (*add_connect)       (struct connect_manager * const pconnman_obj, 
                                   int tcp_client_sock,
                                   uint32_t *psession_id);
/*|*/    int (*start_recv)        (struct connect_manager * const pconnman_obj, uint32_t session_id);
/*|*/    int (*pre_delete_connect)(struct connect_manager * const pconnman_obj, uint32_t session_id);
/*|*/    int (*recv_handle)       (int conn_sock, uint32_t session_id);
/*|*/    int (*send_package)      (struct connect_manager * const pconnman_obj, uint32_t session_id, const uint8_t *pdata, uint32_t data_len);
/*|*/}ST_CONNECT_MANAGER;
//+------------------------------------------------------------------------------------------+

#ifdef __cplusplus
extern "C" {
#endif
//+------------------------------------------------------------------------------------------+
//|                                       函数/变量声明
//+------------------------------------------------------------------------------------------+
/*|*/int connect_manager_create(ST_CONNECT_MANAGER **ppconnman_obj, int (*recv_handle)(int conn_sock, uint32_t session_id));
/*|*/int connect_manager_destroy(ST_CONNECT_MANAGER **ppconnman_obj);
//|
/*|*/int tcp_client_create(const char remote_ip_address[], int port);
//+------------------------------------------------------------------------------------------+
#ifdef __cplusplus
}
#endif /* End of __cplusplus*/

#endif /* End of #define CONNECT_MANAGER__ */
